package jm.nj.demo07main.demo02;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * 迭代器:集合取出元素的方式
 *
 * 原理:判断是否还有元素,有就取,没有就结束
 *
 * 迭代器是一个接口:java.util.Iterator接口
 *
 * 迭代器中的方法
 * boolean hasNext() 判断集合是否有下个元素,有true,没有false
 * E next() 返回迭代的下个元素.取取出集合中的下一个
 *
 * Iterator是一个接口,需要找实现类
 * 在Collection集合中有一个方法iterator(),此方法返回的是迭代器的实现类对象(集合的内部类)
 * Iterator<E> iterator() 返回在此Collection的与元素上进行迭代器.
 * ArrayList集合实现collection接口,重写了iterator()方法,获取的就是迭代器的实现类对象
 *
 * 迭代器的使用步骤:
 * 1.创建集合对象,往集合中 添加元素
 *           Collection<String> coll = new ArrayList<String>();
 * 2.调用集合中的方法iterator(),获取迭代器实现类对象,不知道返回的是哪个子类对象,
 *       所有可以使用Iterator接口接收(多态)
 * 3.通过hasNext()方法和next()方法把元素取出
 * */
public class Demo01Iterator {


    public static void main(String[] args) {
        //1.创建集合对象,添加元素
        Collection<String> coll = new ArrayList<String>();
        coll.add("中国");
        coll.add("香港");
        coll.add("台湾");
        //2.调用集合中iterator()方法,获取迭代器实现类对象
        //迭代器的泛型跟着集合走
        Iterator<String> it = coll.iterator();

        //通过hasNext()方法和next方法把集合中的元素取出

/*        boolean b = it.hasNext();
        String s = it.next();
        System.out.println(b);
        System.out.println(s);

        b = it.hasNext();
        s = it.next();
        System.out.println(b);
        System.out.println(s);

        b = it.hasNext();
        s = it.next();
        System.out.println(b);
        System.out.println(s);*/

        /*b = it.hasNext();
        s = it.next();
        System.out.println(b);
        System.out.println(s);*///NoSuchElementException

        /*
         * 发现以上取出元素是一个重复的过程,所以可以使用循环简化代码
         * 不知道集合中有多少元素,所以使用死循环
         * 死循环的结束条件hasNext方法返回false,结束循环
         * */

        while (it.hasNext()) {
            //使用next取
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("-------");
//迭代器的for循环格式
        for (Iterator<String>it1= coll.iterator(); it1.hasNext() ; ) {
            String s = it1.next();
            System.out.println(s);
        }
    }
}
